cssimageradial: Handle "partial" gradients correctly
authorBenjamin Otte <otte@redhat.com>
Mon, 19 Dec 2016 22:30:02 +0000 (23:30 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:12 +0000 (18:01 +0100)
When the first/last color stop is not at 0%/100%, we need to start the
repeating at their offsets and not at 0%/100%.

Attached reftest demonstrates the problem.

gtk/gtkcssimageradial.c
testsuite/reftests/Makefile.am
testsuite/reftests/repeating-radial-gradient-at-beginning.css [new file with mode: 0644]
testsuite/reftests/repeating-radial-gradient-at-beginning.ref.ui [new file with mode: 0644]
testsuite/reftests/repeating-radial-gradient-at-beginning.ui [new file with mode: 0644]

index e22d9b805bafb25a8f8fe81d2d25e096c2811bb7..585d136d2ceb915fb5d17b1d885c601987ca1578 100644 (file)
@@ -163,7 +163,7 @@ gtk_css_image_radial_draw (GtkCssImage *image,
 
   gtk_css_image_radial_get_start_end (radial, radius, &start, &end);
 
-  pattern = cairo_pattern_create_radial (0, 0, 0, 0, 0, radius);
+  pattern = cairo_pattern_create_radial (0, 0, radius * start, 0, 0, radius * end);
   if (yscale != 1.0)
     {
       cairo_matrix_init_scale (&matrix, 1.0, 1.0 / yscale);
index c0c1beab689e9e725b0ab98a9b5dcf1612342612..2dbca1209cb4f1c98dde6463d63cdcdca704fbf5 100644 (file)
@@ -377,6 +377,9 @@ testdata = \
        quit-mnemonic.css \
        quit-mnemonic.ref.ui \
        quit-mnemonic.ui \
+       repeating-radial-gradient-at-beginning.css \
+       repeating-radial-gradient-at-beginning.ref.ui \
+       repeating-radial-gradient-at-beginning.ui \
        reset-to-defaults.css \
        revealer-extra-size.ref.ui \
        revealer-extra-size.ui \
diff --git a/testsuite/reftests/repeating-radial-gradient-at-beginning.css b/testsuite/reftests/repeating-radial-gradient-at-beginning.css
new file mode 100644 (file)
index 0000000..0f4dd2e
--- /dev/null
@@ -0,0 +1,11 @@
+window {
+  background: repeating-radial-gradient(red 50%, blue, red);
+}
+
+#reference {
+  background-image: radial-gradient(red, blue, red), repeating-radial-gradient(red 50%, blue, red);
+  background-size: 50% 50%, 100% 100%;
+  background-repeat: no-repeat;
+  background-position: center;
+}
+
diff --git a/testsuite/reftests/repeating-radial-gradient-at-beginning.ref.ui b/testsuite/reftests/repeating-radial-gradient-at-beginning.ref.ui
new file mode 100644 (file)
index 0000000..3f0f3f1
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">64</property>
+    <property name="height_request">32</property>
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+    <property name="name">reference</property>
+  </object>
+</interface>
diff --git a/testsuite/reftests/repeating-radial-gradient-at-beginning.ui b/testsuite/reftests/repeating-radial-gradient-at-beginning.ui
new file mode 100644 (file)
index 0000000..a6c83b8
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">64</property>
+    <property name="height_request">32</property>
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+  </object>
+</interface>